/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.model;

import br.com.foxline.atlasmobile.enums.TipoDocumento;
import br.com.foxline.validator.CNPJ;
import br.com.foxline.validator.CPF;
import java.io.Serializable;
import java.text.ParseException;
import java.util.Date;
import javax.persistence.*;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author ely
 */
@Entity
public class Proprietario implements Serializable {

    @Id
    @SequenceGenerator(sequenceName = "seq_proprietario", name = "seq_proprietario", allocationSize = 1)
    @GeneratedValue(generator = "seq_proprietario", strategy = GenerationType.SEQUENCE)
    private Long id;
    @Version
    private int versao;
    private String nome;
    @CPF
    private String cpf;
    @CNPJ
    private String cnpj;
    private String nomeFantasia;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataNasc;
    @Enumerated(EnumType.STRING)
    private TipoDocumento tipoDocumento;
    private String rg;
    private String orgaoEmissor;
    private String profissao;
    private String localTrabalho;
    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
    Endereco endereco;

    public Proprietario() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Date getDataNasc() {
        return dataNasc;
    }

    public void setDataNasc(Date dataNasc) {
        this.dataNasc = dataNasc;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public String getNomeFantasia() {
        return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getOrgaoEmissor() {
        return orgaoEmissor;
    }

    public void setOrgaoEmissor(String orgaoEmissor) {
        this.orgaoEmissor = orgaoEmissor;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public String getLocalTrabalho() {
        return localTrabalho;
    }

    public void setLocalTrabalho(String localTrabalho) {
        this.localTrabalho = localTrabalho;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 79 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 79 * hash + this.versao;
        hash = 79 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 79 * hash + (this.cpf != null ? this.cpf.hashCode() : 0);
        hash = 79 * hash + (this.cnpj != null ? this.cnpj.hashCode() : 0);
        hash = 79 * hash + (this.nomeFantasia != null ? this.nomeFantasia.hashCode() : 0);
        hash = 79 * hash + (this.dataNasc != null ? this.dataNasc.hashCode() : 0);
        hash = 79 * hash + (this.tipoDocumento != null ? this.tipoDocumento.hashCode() : 0);
        hash = 79 * hash + (this.rg != null ? this.rg.hashCode() : 0);
        hash = 79 * hash + (this.orgaoEmissor != null ? this.orgaoEmissor.hashCode() : 0);
        hash = 79 * hash + (this.profissao != null ? this.profissao.hashCode() : 0);
        hash = 79 * hash + (this.localTrabalho != null ? this.localTrabalho.hashCode() : 0);
        hash = 79 * hash + (this.endereco != null ? this.endereco.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Proprietario other = (Proprietario) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.versao != other.versao) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        if ((this.cpf == null) ? (other.cpf != null) : !this.cpf.equals(other.cpf)) {
            return false;
        }
        if ((this.cnpj == null) ? (other.cnpj != null) : !this.cnpj.equals(other.cnpj)) {
            return false;
        }
        if ((this.nomeFantasia == null) ? (other.nomeFantasia != null) : !this.nomeFantasia.equals(other.nomeFantasia)) {
            return false;
        }
        if (this.dataNasc != other.dataNasc && (this.dataNasc == null || !this.dataNasc.equals(other.dataNasc))) {
            return false;
        }
        if (this.tipoDocumento != other.tipoDocumento) {
            return false;
        }
        if ((this.rg == null) ? (other.rg != null) : !this.rg.equals(other.rg)) {
            return false;
        }
        if ((this.orgaoEmissor == null) ? (other.orgaoEmissor != null) : !this.orgaoEmissor.equals(other.orgaoEmissor)) {
            return false;
        }
        if ((this.profissao == null) ? (other.profissao != null) : !this.profissao.equals(other.profissao)) {
            return false;
        }
        if ((this.localTrabalho == null) ? (other.localTrabalho != null) : !this.localTrabalho.equals(other.localTrabalho)) {
            return false;
        }
        if (this.endereco != other.endereco && (this.endereco == null || !this.endereco.equals(other.endereco))) {
            return false;
        }
        return true;
    }

    @Override
    // Nunca mexer no To String pois está sendo usado no relatório do memorial descritivo
    public String toString() {
        return nome;
    }

    public String formatedDocument() {
        MaskFormatter mask;
        String tipo;
        
        if (this.tipoDocumento != null) {
            tipo = this.tipoDocumento.equals(TipoDocumento.CNPJ) ? "CNPJ : " : "CPF : ";
        } else {
            if (this.nome != null && !this.nome.equals("")) {
                tipo = "CPF : ";
            } else {
                tipo = "CNPJ : ";
            }
        }
        
        try {
            String format, value;
            if (this.tipoDocumento != null) {
                if (this.tipoDocumento.equals(TipoDocumento.CPF)) {
                    format = "###.###.###-##";
                    value = this.getCpf();
                } else {
                    format = "##.###.###/####-##";
                    value = this.getCnpj();
                }
            } else {
                if (this.nome != null && !this.nome.equals("")) {
                    format = "###.###.###-##";
                    value = this.getCpf();
                } else {
                    format = "##.###.###/####-##";
                    value = this.getCnpj();
                }
            }

            mask = new MaskFormatter(format);
            mask.setValueContainsLiteralCharacters(false);
            return tipo + mask.valueToString(value);
        } catch (ParseException e) {
            // throw new RuntimeException(e);
        }
        return "";
    }
}
